'use strict';

/**
 * 获取变量的类型
 * @param {*} obj
 * @returns
 */
export const getType = obj => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

/**
 * 金额格式化
 * @param {*} number 要格式化的数字
 * @param {*} decimals 保留几位小数
 * @param {*} dec_point 小数点符号
 * @param {*} thousands_sep 千分位符号
 * @returns 
 */
export const moneyFormat = (number, decimals, dec_point, thousands_sep) => {
    number = (number + '').replace(/[^0-9+-Ee.]/g, '')
    const n = !isFinite(+number) ? 0 : +number
    const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals)
    const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep
    const dec = typeof dec_point === 'undefined' ? '.' : dec_point
    let s = ''
    const toFixedFix = function (n, prec) {
        const k = Math.pow(10, prec)
        return '' + Math.ceil(n * k) / k
    }
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
    const re = /(-?\d+)(\d{3})/
    while (re.test(s[0])) {
        s[0] = s[0].replace(re, '$1' + sep + '$2')
    }

    if ((s[1] || '').length < prec) {
        s[1] = s[1] || ''
        s[1] += new Array(prec - s[1].length + 1).join('0')
    }
    return s.join(dec)
}

/**
 * 模糊搜索
 * @param {*} list 原数组
 * @param {*} keyword 查询的关键词
 * @param {*} attribute 数组需要检索属性
 * @returns
 */
export function fuzzyQuery(list, keyword, attribute) {
    const reg = new RegExp(keyword);
    const arr = [];
    list.forEach((item, index) => {
        if (reg.test(list[index][attribute])) {
            arr.push(item);
        }
    });
    return arr;
}


/**
 * 统一信用代码脱敏
 * @param {*} idCard 
 * @returns 
 */
export function idCardReplace(idCard) {
    if (idCard && idCard.length == 18) {
        return idCard.replace(/^(.{6})(.*)(.{4})$/, '$1******$3');
    } else {
        return '--'
    }
}

/**
 * 手机号脱敏 例如：17752807484 >>> 例如：177****7484
 * @param {*} url 
 */
export function phoneReplate(phone) {
    if (phone) {
        if (/\*/.test(phone)) {
            return phone;
        }
        return phone.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
    } else {
        return '--'
    }

}

/**
 * 深拷贝函数
 * @param {*} target 目标
 * @param {*} map
 * @returns
 */
export const _completeDeepClone = (target, map = new WeakMap()) => {
	// 函数 正则 日期 ES6新对象 等不是直接返回其地址， 而是重新创建
	// 需要避免出现循环引用的情况
	// 基本数据类型，直接返回
	if (typeof target !== 'object' || target === null) return target;
	// 函数 正则 日期 ES6新对象,执行构造体，返回新的对象
	const constructor = target.constructor;
	if (/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target);
	// map标记每一个出现过的属性，避免循环引用
	if (map.get(target)) return map.get(target);
	map.set(target, true);
	const cloneTarget = Array.isArray(target) ? [] : {};
	for (prop in target) {
		if (target.hasOwnProperty(prop)) {
			cloneTarget[prop] = _completeDeepClone(target[prop], map);
		}
	}
	return cloneTarget;
};

/**
 * 匹配正则生成随机5位验证码
 * @returns 随机5位验证码
 */
export function randomGeneratorVerificationCode() {
	let regexp = /[A-Za-z0-9]{5}/;
	let str = '';
	while (!regexp.test(str)) {
		str = '';
		for (let i = 0; i < 5; i++) {
			str += String.fromCharCode(Math.floor(Math.random() * 128));
		}
	}
	return str;
}
/**
 * 计算两个日期之间的间隔
 * @param {*} d1
 * @param {*} d2
 * @returns
 */
export const dayDiff = (d1, d2) => Math.ceil(Math.abs(d1.getTime() - d2.getTime()) / 86400000);

/**
 * 滚动到页面顶部
 * @returns
 */
export const goToTop = () => window.scrollTo(0, 0);

/**
 * 判断是否为苹果设备
 * @returns
 */
export const isAppleDevice = () => /Mac|iPod|iPhone|iPad/.test(navigator.platform);

/**
 * 生成uuid函数
 * @returns
 */
export function getUUID() {
	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
		return (c === 'x' ? (Math.random() * 16) | 0 : 'r&0x3' | '0x8').toString(16);
	});
}

/**
 * 开启全屏
 * @param {*} element 
 */
export const launchFullscreen = (element) => {
	if (element.requestFullscreen) {
		element.requestFullscreen()
	} else if (element.mozRequestFullScreen) {
		element.mozRequestFullScreen()
	} else if (element.msRequestFullscreen) {
		element.msRequestFullscreen()
	} else if (element.webkitRequestFullscreen) {
		element.webkitRequestFullScreen()
	}
}
/**
 * 关闭全屏
 */
export const exitFullscreen = () => {
	if (document.exitFullscreen) {
		document.exitFullscreen()
	} else if (document.msExitFullscreen) {
		document.msExitFullscreen()
	} else if (document.mozCancelFullScreen) {
		document.mozCancelFullScreen()
	} else if (document.webkitExitFullscreen) {
		document.webkitExitFullscreen()
	}
}

/**
 * 判断手机是Andoird还是IOS
 * @returns 
 */
export const getOSType = () => {
	let u = navigator.userAgent, app = navigator.appVersion;
	let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
	let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
	if (isIOS) {
		return 1;
	}
	if (isAndroid) {
		return 2;
	}
	return 3;
}

/**
 * 滚动到元素位置
 * @param {*} element 
 */
export const smoothScroll = element => {
	document.querySelector(element).scrollIntoView({
		behavior: 'smooth'
	});
};

